<?php
class V_DB
{
	/* -- Идентификатор подключения -- */
	private static $_connection;
    
	/** Метод вызывается сразу после загрузки класса
	 * @return null
	 */
	public static function activateModule () {
    	if (!isset($_connection)) {
    		self::connectBase ();
    	}
    }
	
    /** Подключение к базе данных
	 * @return bool
	 */
    public static function connectBase () {
    	if ($config=V_Config::getSection('base')) {
    		self::$_connection = new PDO(
    			$config['bd'].':host='.$config['host'].';dbname='.$config['dbase'], 
    			$config['login'], $config['password']
    		);
    		self::query("set character_set_client='utf8'");
            self::query("set character_set_results='utf8'");
            self::query("set collation_connection='utf8_general_ci'");
            return self::$_connection;
    	}
    	else return false;
    }
    
    /** Запрос - получение данных из базы
     * @param query строка запроса
	 * @return connection
	 */
    public static function query ($query) {
    	return self::$_connection->query($query);
    }
    
    /** Запрос - внесение изменений в базу данных
     * @param query строка запроса
	 * @return pdo_result
	 */
    public static function exec ($query) {
    	self::$_connection->exec($query);
    }
    
    /** Получить таблицу из базы данных в виде ассоциативного массива
     * @param query строка запроса
	 * @return array
	 */
    public static function fetchAll ($query) {
    	$result = self::query($query);
    	if (!empty($result)) return $result->fetchAll(PDO::FETCH_ASSOC);
    	else return false;
    }
	/** Получить строку из базы данных в виде ассоциативного массива
     * @param query строка запроса
	 * @return array
	 */
    public static function fetch ($query) {
    	$result = self::query($query);
    	if (!empty($result)) return $result->fetch(PDO::FETCH_ASSOC);
    	else return false;
    }
    
    /** Получить количество записей в таблице
     * @param table название таблицы
     * @param where
	 * @return array
	 */
	public static function count ($table,$where = null) {
		$sql = "SELECT COUNT(*) FROM `".$table."`";
		!empty ($where) ? $sql .=" WHERE ".$where : null ;
		
		$record = self::fetch($sql);
		if (!empty($record['COUNT(*)'])) return $record['COUNT(*)'];
		else return 0;
	}
    
	/** Экранирование запроса
     * @param string строка, которую нужно экранировать
	 * @return string
	 */
    public static function escape($string) {
		return mysql_escape_string ($string);
    }
    
    /** Добавление данных в таблицу
     * @param table - название таблицы
     * @param data - массив данных в виде Array (Array('name'=>'название поля','value'=>'значение'),...)
     * @param quote - экраниерование значений, по умолчанию true
	 * @return string
	 */
	public static function insertArray ($table,$data,$quote=true) {
		foreach ($data as $item) {
    		$quote ? $names[]=self::escape($item['name']) : $names[]=$item['name'];
    		$quote ? $values[]='"'.self::escape($item['value']).'"' : $values[]=$item['value'];
    	}
    	$name=implode (', ',$names);
    	$value=implode (', ',$values);
    	$query = 'INSERT INTO '.self::escape($table).' ('.$name.') VALUES ('.$value.')';
    	return self::exec($query);
    }
    
     /** Добавление данных в таблицу
     * @param table - название таблицы
     * @param data - массив данных в виде Array ('название поля' => 'значение'),...)
     * @param quote - экраниерование значений, по умолчанию true
	 * @return string
	 */
	public static function insertAssoc ($table,$data,$quote=true) {
		foreach ($data as $item=>$value) {
    		$quote ? $names[]=self::escape($item) : $names[]=$item;
    		$quote ? $values[]='"'.self::escape($value).'"' : $values[]=$value;
    	}
    	$name=implode (', ',$names);
    	$value=implode (', ',$values);
    	$query = 'INSERT INTO '.self::escape($table).' ('.$name.') VALUES ('.$value.')';
    	return self::exec($query);
    }
    
    /** Обновление данных в таблице
     * @param table - название таблицы
     * @param data - массив данных в виде Array (Array('name'=>'название поля','value'=>'значение'),...)
     * @param quote - экраниерование значений, по умолчанию true
     * @param where - условие обновления
	 * @return string
	 */
	public static function updateArray ($table,$where,$data,$quote=true) {
		foreach ($data as $item) {
    		$quote ? $names[]=self::escape($item['name']) : $names[]=$item['name'];
    		$quote ? $values[]='"'.self::escape($item['value']).'"' : $values[]=$item['value'];
    	}
    	$name=implode (', ',$names);
    	$value=implode (', ',$values);
    	$query = 'INSERT INTO '.self::escape($table).' ('.$name.') VALUES ('.$value.')';
    	return self::exec($query);
    }
    
     /** Обновление данных в таблице
     * @param table - название таблицы
     * @param data - массив данных в виде Array ('название поля' => 'значение'),...)
     * @param quote - экраниерование значений, по умолчанию true
     * @param where - условие обновления
	 * @return string
	 */
	public static function updateAssoc ($table,$data,$where,$quote=true) {
		foreach ($data as $item=>$value) {
    		$quote ?  $sets[]=$item.'="'.self::escape($value).'"' : $sets[]=$item.'="'.$value.'"';
    	}
    	$set=implode (', ',$sets);
    	$query = 'UPDATE '.self::escape($table).' SET '.$set.' WHERE '.$where;
    	return self::exec($query);
    }
    
    /** Удаление данных из таблицеы
     * @param table - название таблицы
     * @param where - условие удаления
	 * @return string
	 */
    public static function delete ($table,$where) {
    	$query = 'DELETE FROM '.self::escape($table).' WHERE '.$where;
    	return self::exec($query);
    }
}